from bs4 import BeautifulSoup
from urllib.parse import urljoin
import re  # 新增正则表达式模块


def novel_search_data(html_text):
    """
    从HTML文本中提取书籍信息并生成结构化数据
    参数:
        html_text: 包含书籍链接的HTML文本
    返回:
        {"data": [{"name": "", "author": "", "kind": "", "lastChapter": "", "url": ""}, ...]}
    """
    soup = BeautifulSoup(html_text, 'html.parser')
    base_url = "https://www.biquuge.com/"
    
    # 查找所有书籍块容器
    book_blocks = soup.find_all('div', class_='col-12 col-md-6')
    result = {"data": []}
    
    for block in book_blocks:
        # 1. 提取书名（从img标签的alt属性获取）
        img_tag = block.find('img')
        name = img_tag.get('alt', '').strip() if img_tag else ''
        
        # 2. 提取作者（从包含"作者："文本的dd标签中提取span内容）
        author_dd = block.find('dd', class_='book_other')
        author = ""
        if author_dd and '作者：' in author_dd.text:
            author_span = author_dd.find('span')
            author = author_span.text.strip() if author_span else author_dd.text.replace('作者：', '').strip()
        
        # 3. 提取类别（从包含"状态："的dd标签提取）
        kind_dd = block.find('dd', class_='book_other', string=lambda t: t and '状态：' in t)
        kind = kind_dd.text.replace('状态：', '').strip() if kind_dd else ''
        
        # 4. 提取最新章节（从包含"最新章节："的dd标签中提取a标签文本）
        lastChapter = ''
        for dd in block.find_all('dd', class_='book_other'):
            if '最新章节：' in dd.get_text():  # 检查整个dd标签文本是否包含关键词[3](@ref)
                a_tag = dd.find('a')  # 在匹配的dd标签内查找a标签[6](@ref)
                if a_tag:
                    # 使用get_text(strip=True)处理文本中的空白和换行符[3](@ref)
                    lastChapter = a_tag.get_text(strip=True)
                    break  # 找到后立即跳出循环
        
        # 5. 提取URL（从第一个a标签的href获取）
        first_link = block.find('a')
        url = urljoin(base_url, first_link['href']) if first_link and first_link.has_attr('href') else ''
        
        # 添加到结果集
        item = {
            "name": name,
            "author": author,
            "kind": kind,
            "lastChapter": lastChapter,
            "url": url
        }
        result["data"].append(item)
    
    return result



def novel_toc_data(html_text):
    """
    从HTML文本中提取小说目录信息
    参数:
        html_text: 包含小说目录的HTML文本
    返回:
        {"data": [{"name": "章节名称", "url": "完整URL"}, ...]}
    """
    soup = BeautifulSoup(html_text, 'html.parser')
    base_url = "https://www.biquuge.com/"  # 网站基础URL
    
    # 查找所有章节列表项
    chapter_items = soup.find_all('li', class_='col-md-3')
    result = {"data": []}
    
    for item in chapter_items:
        # 查找<a>标签
        link = item.find('a')
        if link:
            # 提取章节名称
            name = link.get_text(strip=True)
            
            # 提取相对URL并拼接完整URL
            relative_url = link.get('href', '')
            full_url = urljoin(base_url, relative_url)
            
            # 添加到结果集
            chapter_data = {
                "name": name,
                "url": full_url
            }
            result["data"].append(chapter_data)
    
    return result


def novel_book_data(html_text):
    """
    从HTML文本中提取小说元数据信息
    参数:
        html_text: 包含小说元数据的HTML文本
    返回:
        包含name, author, lastChapter, updateTime, coverUrl, intro的字典
    """
    soup = BeautifulSoup(html_text, 'html.parser')
    result = {"data": []}
    # 1. 提取书名
    book_name_tag = soup.find('meta', {'property': 'og:novel:book_name'})
    name = book_name_tag.get('content', '').strip() if book_name_tag else ''
    
    # 2. 提取作者
    author_tag = soup.find('meta', {'property': 'og:novel:author'})
    author = author_tag.get('content', '').strip() if author_tag else ''
    
    # 3. 提取最新章节
    last_chapter_tag = soup.find('meta', {'property': 'og:novel:latest_chapter_name'})
    lastChapter = last_chapter_tag.get('content', '').strip() if last_chapter_tag else ''
    
    # 4. 提取更新时间
    update_time_tag = soup.find('meta', {'property': 'og:novel:update_time'})
    updateTime = update_time_tag.get('content', '').strip() if update_time_tag else ''
    
    # 5. 提取封面URL（处理协议相对URL）
    cover_tag = soup.find('meta', {'property': 'og:image'})
    coverUrl = cover_tag.get('content', '').strip() if cover_tag else ''
    if coverUrl.startswith('//'):
        coverUrl = 'https:' + coverUrl
    
    # 6. 提取简介（保留原始格式）
    intro_tag = soup.find('meta', {'property': 'og:description'})
    intro = intro_tag.get('content', '').strip() if intro_tag else ''
    
    # 添加到结果集
    item = {
        "name": name,
        "author": author,
        "lastChapter": lastChapter,
        "updateTime": updateTime,
        "coverUrl": coverUrl,
        "intro": intro
        }
    result["data"].append(item)

    return result


def novel_content_data(html_text):
    """
    从HTML文本中提取小说正文内容和下一章链接
    参数:
        html_text: 包含小说内容的HTML文本
    返回:
        {"content": 清理后的正文文本, "nextUrl": 下一章完整URL}
    """
    soup = BeautifulSoup(html_text, 'html.parser')
    base_url = "https://www.biquuge.com/"
    
    result = {}
    
    # 1. 提取正文内容（从class="font_max"的article标签）
    article_tag = soup.find('article', class_='font_max')
    if article_tag:
        # 清理特殊字符并保留换行结构
        content = article_tag.get_text("\n", strip=True)
        
        # 新增：过滤"第(x/y)页"模式文本 [6,9](@ref)
        # 使用正则表达式移除"第(数字/数字)页"格式的内容
        # 增强版：匹配"第"开头、"页"结尾，中间含数字分页的多种格式
        content = re.sub(r'第[\s(]*\d+/\d+[\s)]*页', '', content)
        
        # 合并连续空行并去除首尾空白
        content = "\n".join([p.strip() for p in content.splitlines() if p.strip()])
        result["content"] = content
    else:
        result["content"] = ""
    
    # 2. 提取下一章URL（从id="next"的a标签）
    next_link = soup.find('a', id='next')
    if next_link and next_link.has_attr('href'):
        relative_url = next_link['href']
        next_url = urljoin(base_url, relative_url)
        
        # 检查URL是否包含下划线
        result["nextUrl"] = next_url if '_' in next_url else ""
    else:
        result["nextUrl"] = ""
    return result